

public class Demo1 {
    //死锁演示,属于嵌套使用
    public static void main(String[] args) {
        Object locker1=new Object();
        Object locker2=new Object();
        Thread t1=new Thread(()->{
            synchronized(locker1){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized(locker2){//但这里的锁放到外面就不会死锁，当前代码注释掉即可
                    System.out.println("锁1");
                }
            }
//            synchronized(locker2){
//                System.out.println("锁1");
//            }

        });
        Thread t2=new Thread(()->{
            synchronized(locker1){//或者解决死锁的方法就是让循环等待的顺序和前面保持一致，这样也不会造成死锁，这里原本locker2换成locker1，底下的locker1换成locker2即可
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized(locker1){//这里和上面一样的放到外面就不会死锁，当前代码注释掉即可
                    System.out.println("锁2");
                }
            }
//            synchronized(locker2){
//                System.out.println("锁2");
//            }
        });

        t1.start();
        t2.start();
    }
}
